home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / technowar.lha / data / techno / gv_player.i < prev    next >
Text File  |  1980-02-02  |  25KB  |  1,318 lines

  1.  
  2.     opt    d+
  3.  
  4. DMAWait = 300 ; Set this as low as possible without losing low notes.
  5.  
  6. ; CIA Version 1:
  7. ; Call SetCIAInt to install the interrupt server. Then call mt_init
  8. ; to initialize the song. Playback starts when the mt_enable flag
  9. ; is set to a nonzero value. To end the song and turn off all voices,
  10. ; call mt_end. At last, call ResetCIAInt to remove the interrupt.
  11.  
  12. ; This playroutine is not very fast, optimized or well commented,
  13. ; but all the new commands in PT2.1 should work.
  14. ; If it's not good enough, you'll have to change it yourself.
  15. ; We'll try to write a faster routine soon...
  16.  
  17. ; Changes from V1.0C playroutine:
  18. ; - Vibrato depth changed to be compatible with Noisetracker 2.0.
  19. ;   You'll have to double all vib. depths on old PT modules.
  20. ; - Funk Repeat changed to Invert Loop.
  21. ; - Period set back earlier when stopping an effect.
  22.  
  23. ; You can use this routine to play a module. Just remove the semicolons.
  24. ; Exit by pressing both mousebuttons.
  25. ;
  26. ain    BSR.S    SetCIAInt
  27.     BSR    mt_init
  28.     ST    mt_Enable
  29.     MOVE.L    4.W,A6
  30.     LEA    DOSname(PC),A1
  31.     MOVEQ    #0,D0
  32.     JSR    LVOOpenLibrary(A6)
  33.     TST.L    D0
  34.     BEQ.S    theend
  35.     MOVE.L    D0,A6
  36. wloop    MOVEQ    #10,D1
  37.     JSR    LVODelay(A6)
  38.     BTST    #6,$BFE001
  39.     BNE.S    wloop
  40.     BTST    #2,$DFF016
  41.     BNE.S    wloop
  42.     MOVE.L    A6,A1
  43.     MOVE.L    4.W,A6
  44.     JSR    LVOCloseLibrary(A6)
  45. theend    BSR    mt_end
  46.     BSR    ResetCIAInt
  47.     RTS
  48.  
  49. DOSname    dc.b "dos.library",0
  50.  
  51. ;---- CIA Interrupt ----
  52.  
  53. AddICRVector    =   -6
  54. RemICRVector    =  -12
  55. LVOOpenResource    = -498
  56. LVOOpenLibrary     = -552
  57. LVOCloseLibrary    = -414
  58. LVODelay    = -198
  59.  
  60. ciatalo = $400
  61. ciatahi = $500
  62. ciatblo = $600
  63. ciatbhi = $700
  64. ciacra  = $E00
  65. ciacrb  = $F00
  66.  
  67. SetCIAInt
  68.     MOVEQ    #2,D6
  69.     LEA    $BFD000,A5
  70.     MOVE.B    #'b',CIAAname+3
  71. SetCIALoop
  72.     MOVEQ    #0,D0
  73.     LEA    CIAAname(PC),A1
  74.     MOVE.L    4.W,A6
  75.     JSR    LVOOpenResource(A6)
  76.     MOVE.L    D0,CIAAbase
  77.     BEQ    mt_Return
  78.  
  79.     LEA    GfxName(PC),A1
  80.     MOVEQ    #0,D0
  81.     JSR    LVOOpenLibrary(A6)
  82.     TST.L    D0
  83.     BEQ    ResetCIAInt
  84.     MOVE.L    D0,A1
  85.     MOVE.W    206(A1),D0    ; DisplayFlags
  86.     BTST    #2,D0        ; PAL?
  87.     BEQ.S    WasNTSC
  88.     MOVE.L    #1773447,D7 ; PAL
  89.     BRA.S    sciask
  90. WasNTSC    MOVE.L    #1789773,D7 ; NTSC
  91. sciask    MOVE.L    D7,TimerValue
  92.     DIVU    #125,D7 ; Default to normal 50 Hz timer
  93.     JSR    LVOCloseLibrary(A6)
  94.  
  95.     MOVE.L    CIAAbase(PC),A6
  96.     CMP.W    #2,D6
  97.     BEQ.S    TryTimerA
  98. TryTimerB
  99.     LEA    MusicIntServer(PC),A1
  100.     MOVEQ    #1,D0    ; Bit 1: Timer B
  101.     JSR    AddICRVector(A6)
  102.     MOVE.L    #1,TimerFlag
  103.     TST.L    D0
  104.     BNE.S    CIAError
  105.     MOVE.L    A5,CIAAaddr
  106.     MOVE.B    D7,ciatblo(A5)
  107.     move.b    d7,$1ff
  108.     LSR.W    #8,D7
  109.     MOVE.B    D7,ciatbhi(A5)
  110.     move.b    d7,$1fe
  111.     BSET    #0,ciacrb(A5)
  112.     RTS
  113.  
  114. TryTimerA
  115.     LEA    MusicIntServer(PC),A1
  116.     MOVEQ    #0,D0    ; Bit 0: Timer A
  117.     JSR    AddICRVector(A6)
  118.     CLR.L    TimerFlag
  119.     TST.L    D0
  120.     BNE.S    CIAError
  121.     MOVE.L    A5,CIAAaddr
  122.     MOVE.B    D7,ciatalo(A5)
  123.     move.b    d7,$1ff
  124.     LSR.W    #8,D7
  125.     MOVE.B    D7,ciatahi(A5)
  126.     move.b    d7,$1fe
  127.     BSET    #0,ciacra(A5)
  128.     RTS
  129.  
  130. CIAError
  131.     MOVE.B    #'a',CIAAname+3
  132.     LEA    $BFE001,A5
  133.     SUBQ.W    #1,D6
  134.     BNE    SetCIALoop
  135.     CLR.L    CIAAbase
  136.     RTS
  137.  
  138. ResetCIAInt
  139.     MOVE.L    CIAAbase(PC),D0
  140.     BEQ    mt_Return
  141.     CLR.L    CIAAbase
  142.     MOVE.L    D0,A6
  143.     MOVE.L    CIAAaddr(PC),A5
  144.     TST.L    TimerFlag
  145.     BEQ.S    ResTimerA
  146.  
  147.     BCLR    #0,ciacrb(A5)
  148.     MOVEQ    #1,D0
  149.     BRA.S    RemInt
  150.  
  151. ResTimerA
  152.     BCLR    #0,ciacra(A5)
  153.     MOVEQ    #0,D0
  154. RemInt    LEA    MusicIntServer(PC),A1
  155.     MOVEQ    #0,d0
  156.     JSR    RemICRVector(A6)
  157.     RTS
  158.  
  159. ;---- Tempo ----
  160.  
  161. SetTempo
  162.     MOVE.L    CIAAbase(PC),D2
  163.     BEQ    mt_Return
  164.     CMP.W    #32,D0
  165.     BHS.S    setemsk
  166.     MOVEQ    #32,D0
  167. setemsk    MOVE.W    D0,RealTempo
  168.     MOVE.L    TimerValue(PC),D2
  169.     DIVU    D0,D2
  170.     MOVE.L    CIAAaddr(PC),A4
  171.     MOVE.L    TimerFlag(PC),D0
  172.     BEQ.S    SetTemA
  173.     MOVE.B    D2,ciatblo(A4)
  174.     move.b    d2,$1ff
  175.     LSR.W    #8,D2
  176.     MOVE.B    D2,ciatbhi(A4)
  177.     move.b    d2,$1fe
  178.     RTS
  179.  
  180. SetTemA    MOVE.B    D2,ciatalo(A4)
  181.     move.b    d2,$1ff
  182.     LSR.W    #8,D2
  183.     MOVE.B    D2,ciatahi(A4)
  184.     move.b    d2,$1fe
  185.     RTS
  186.  
  187. RealTempo    dc.w 125
  188. CIAAaddr    dc.l 0
  189. CIAAname    dc.b "ciaa.resource",0
  190. CIAAbase    dc.l 0
  191. TimerFlag    dc.l 0
  192. TimerValue    dc.l 0
  193. GfxName        dc.b "graphics.library",0,0
  194.  
  195. MusicIntServer
  196.     dc.l 0,0
  197.     dc.b 2,5    ; type, priority
  198.     dc.l musintname
  199.     dc.l 0,mt_music
  200.  
  201. musintname    dc.b "Protracker MusicInt",0
  202.  
  203. ;---- Playroutine ----
  204.  
  205. n_note        EQU    0  ; W
  206. n_cmd        EQU    2  ; W
  207. n_cmdlo        EQU    3  ; B
  208. n_start        EQU    4  ; L
  209. n_length    EQU    8  ; W
  210. n_loopstart    EQU    10 ; L
  211. n_replen    EQU    14 ; W
  212. n_period    EQU    16 ; W
  213. n_finetune    EQU    18 ; B
  214. n_volume    EQU    19 ; B
  215. n_dmabit    EQU    20 ; W
  216. n_toneportdirec    EQU    22 ; B
  217. n_toneportspeed    EQU    23 ; B
  218. n_wantedperiod    EQU    24 ; W
  219. n_vibratocmd    EQU    26 ; B
  220. n_vibratopos    EQU    27 ; B
  221. n_tremolocmd    EQU    28 ; B
  222. n_tremolopos    EQU    29 ; B
  223. n_wavecontrol    EQU    30 ; B
  224. n_glissfunk    EQU    31 ; B
  225. n_sampleoffset    EQU    32 ; B
  226. n_pattpos    EQU    33 ; B
  227. n_loopcount    EQU    34 ; B
  228. n_funkoffset    EQU    35 ; B
  229. n_wavestart    EQU    36 ; L
  230. n_reallength    EQU    40 ; W
  231.  
  232. mt_init    LEA    mt_data,A0
  233.     MOVE.L    A0,mt_SongDataPtr
  234.     MOVE.L    A0,A1
  235.     LEA    952(A1),A1
  236.     MOVEQ    #127,D0
  237.     MOVEQ    #0,D1
  238. mtloop    MOVE.L    D1,D2
  239.     SUBQ.W    #1,D0
  240. mtloop2    MOVE.B    (A1)+,D1
  241.     CMP.B    D2,D1
  242.     BGT.S    mtloop
  243.     DBRA    D0,mtloop2
  244.     ADDQ.B    #1,D2
  245.             
  246.     LEA    mt_SampleStarts(PC),A1
  247.     ASL.L    #8,D2
  248.     ASL.L    #2,D2
  249.     ADD.L    #1084,D2
  250.     ADD.L    A0,D2
  251.     MOVE.L    D2,A2
  252.     MOVEQ    #30,D0
  253. mtloop3    CLR.L    (A2)
  254.     MOVE.L    A2,(A1)+
  255.     MOVEQ    #0,D1
  256.     MOVE.W    42(A0),D1
  257.     ASL.L    #1,D1
  258.     ADD.L    D1,A2
  259.     ADD.L    #30,A0
  260.     DBRA    D0,mtloop3
  261.  
  262.     OR.B    #2,$BFE001
  263.     MOVE.B    #6,mt_speed
  264.     CLR.B    mt_counter
  265.     CLR.B    mt_SongPos
  266.     CLR.W    mt_PatternPos
  267. mt_end    SF    mt_Enable
  268.     LEA    $DFF000,A0
  269.     CLR.W    $A8(A0)
  270.     CLR.W    $B8(A0)
  271.     CLR.W    $C8(A0)
  272.     CLR.W    $D8(A0)
  273.     MOVE.W    #$F,$DFF096
  274.     RTS
  275.  
  276. mt_music
  277.     move.w    #$f00,$dff180
  278.  
  279.     MOVEM.L    D0-D4/A0-A6,-(SP)
  280.     TST.B    mt_Enable
  281.     BEQ    mt_exit
  282.     ADDQ.B    #1,mt_counter
  283.     MOVE.B    mt_counter(PC),D0
  284.     CMP.B    mt_speed(PC),D0
  285.     BLO.S    mt_NoNewNote
  286.     CLR.B    mt_counter
  287.     TST.B    mt_PattDelTime2
  288.     BEQ.S    mt_GetNewNote
  289.     BSR.S    mt_NoNewAllChannels
  290.     BRA    mt_dskip
  291.  
  292. mt_NoNewNote
  293.     BSR.S    mt_NoNewAllChannels
  294.     BRA    mt_NoNewPosYet
  295.  
  296. mt_NoNewAllChannels
  297.     LEA    $DFF0A0,A5
  298.     LEA    mt_chan1temp(PC),A6
  299.     BSR    mt_CheckEfx
  300.     LEA    $DFF0B0,A5
  301.     LEA    mt_chan2temp(PC),A6
  302.     BSR    mt_CheckEfx
  303.     LEA    $DFF0C0,A5
  304.     LEA    mt_chan3temp(PC),A6
  305.     BSR    mt_CheckEfx
  306.     LEA    $DFF0D0,A5
  307.     LEA    mt_chan4temp(PC),A6
  308.     BRA    mt_CheckEfx
  309.  
  310. mt_GetNewNote
  311.     MOVE.L    mt_SongDataPtr(PC),A0
  312.     LEA    12(A0),A3
  313.     LEA    952(A0),A2    ;pattpo
  314.     LEA    1084(A0),A0    ;patterndata
  315.     MOVEQ    #0,D0
  316.     MOVEQ    #0,D1
  317.     MOVE.B    mt_SongPos(PC),D0
  318.     MOVE.B    (A2,D0.W),D1
  319.     ASL.L    #8,D1
  320.     ASL.L    #2,D1
  321.     ADD.W    mt_PatternPos(PC),D1
  322.     CLR.W    mt_DMACONtemp
  323.  
  324.     LEA    $DFF0A0,A5
  325.     LEA    mt_chan1temp(PC),A6
  326.     BSR.S    mt_PlayVoice
  327.     LEA    $DFF0B0,A5
  328.     LEA    mt_chan2temp(PC),A6
  329.     BSR.S    mt_PlayVoice
  330.     LEA    $DFF0C0,A5
  331.     LEA    mt_chan3temp(PC),A6
  332.     BSR.S    mt_PlayVoice
  333.     LEA    $DFF0D0,A5
  334.     LEA    mt_chan4temp(PC),A6
  335.     BSR.S    mt_PlayVoice
  336.     BRA    mt_SetDMA
  337.  
  338. mt_PlayVoice
  339.     TST.L    (A6)
  340.     BNE.S    mt_plvskip
  341.     BSR    mt_PerNop
  342. mt_plvskip
  343.     MOVE.L    (A0,D1.L),(A6)
  344.     ADDQ.L    #4,D1
  345.     MOVEQ    #0,D2
  346.     MOVE.B    n_cmd(A6),D2
  347.     AND.B    #$F0,D2
  348.     LSR.B    #4,D2
  349.     MOVE.B    (A6),D0
  350.     AND.B    #$F0,D0
  351.     OR.B    D0,D2
  352.     TST.B    D2
  353.     BEQ    mt_SetRegs
  354.     MOVEQ    #0,D3
  355.     LEA    mt_SampleStarts(PC),A1
  356.     MOVE    D2,D4
  357.     SUBQ.L    #1,D2
  358.     ASL.L    #2,D2
  359.     MULU    #30,D4
  360.     MOVE.L    (A1,D2.L),n_start(A6)
  361.     MOVE.W    (A3,D4.L),n_length(A6)
  362.     MOVE.W    (A3,D4.L),n_reallength(A6)
  363.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  364.     MOVE.B    3(A3,D4.L),n_volume(A6)
  365.     MOVE.W    4(A3,D4.L),D3 ; Get repeat
  366.     TST.W    D3
  367.     BEQ.S    mt_NoLoop
  368.     MOVE.L    n_start(A6),D2    ; Get start
  369.     ASL.W    #1,D3
  370.     ADD.L    D3,D2        ; Add repeat
  371.     MOVE.L    D2,n_loopstart(A6)
  372.     MOVE.L    D2,n_wavestart(A6)
  373.     MOVE.W    4(A3,D4.L),D0    ; Get repeat
  374.     ADD.W    6(A3,D4.L),D0    ; Add replen
  375.     MOVE.W    D0,n_length(A6)
  376.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  377.     MOVEQ    #0,D0
  378.     MOVE.B    n_volume(A6),D0
  379.     MOVE.W    D0,8(A5)    ; Set volume
  380.     BRA.S    mt_SetRegs
  381.  
  382. mt_NoLoop
  383.     MOVE.L    n_start(A6),D2
  384.     ADD.L    D3,D2
  385.     MOVE.L    D2,n_loopstart(A6)
  386.     MOVE.L    D2,n_wavestart(A6)
  387.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  388.     MOVEQ    #0,D0
  389.     MOVE.B    n_volume(A6),D0
  390.     MOVE.W    D0,8(A5)    ; Set volume
  391. mt_SetRegs
  392.     MOVE.W    (A6),D0
  393.     AND.W    #$0FFF,D0
  394.     BEQ    mt_CheckMoreEfx    ; If no note
  395.     MOVE.W    2(A6),D0
  396.     AND.W    #$0FF0,D0
  397.     CMP.W    #$0E50,D0
  398.     BEQ.S    mt_DoSetFineTune
  399.     MOVE.B    2(A6),D0
  400.     AND.B    #$0F,D0
  401.     CMP.B    #3,D0    ; TonePortamento
  402.     BEQ.S    mt_ChkTonePorta
  403.     CMP.B    #5,D0
  404.     BEQ.S    mt_ChkTonePorta
  405.     CMP.B    #9,D0    ; Sample Offset
  406.     BNE.S    mt_SetPeriod
  407.     BSR    mt_CheckMoreEfx
  408.     BRA.S    mt_SetPeriod
  409.  
  410. mt_DoSetFineTune
  411.     BSR    mt_SetFineTune
  412.     BRA.S    mt_SetPeriod
  413.  
  414. mt_ChkTonePorta
  415.     BSR    mt_SetTonePorta
  416.     BRA    mt_CheckMoreEfx
  417.  
  418. mt_SetPeriod
  419.     MOVEM.L    D0-D1/A0-A1,-(SP)
  420.     MOVE.W    (A6),D1
  421.     AND.W    #$0FFF,D1
  422.     LEA    mt_PeriodTable(PC),A1
  423.     MOVEQ    #0,D0
  424.     MOVEQ    #36,D2
  425. mt_ftuloop
  426.     CMP.W    (A1,D0.W),D1
  427.     BHS.S    mt_ftufound
  428.     ADDQ.L    #2,D0
  429.     DBRA    D2,mt_ftuloop
  430. mt_ftufound
  431.     MOVEQ    #0,D1
  432.     MOVE.B    n_finetune(A6),D1
  433.     MULU    #36*2,D1
  434.     ADD.L    D1,A1
  435.     MOVE.W    (A1,D0.W),n_period(A6)
  436.     MOVEM.L    (SP)+,D0-D1/A0-A1
  437.  
  438.     MOVE.W    2(A6),D0
  439.     AND.W    #$0FF0,D0
  440.     CMP.W    #$0ED0,D0 ; Notedelay
  441.     BEQ    mt_CheckMoreEfx
  442.  
  443.     MOVE.W    n_dmabit(A6),$DFF096
  444.     BTST    #2,n_wavecontrol(A6)
  445.     BNE.S    mt_vibnoc
  446.     CLR.B    n_vibratopos(A6)
  447. mt_vibnoc
  448.     BTST    #6,n_wavecontrol(A6)
  449.     BNE.S    mt_trenoc
  450.     CLR.B    n_tremolopos(A6)
  451. mt_trenoc
  452.     MOVE.L    n_start(A6),(A5)    ; Set start
  453.     MOVE.W    n_length(A6),4(A5)    ; Set length
  454.     MOVE.W    n_period(A6),D0
  455.     MOVE.W    D0,6(A5)        ; Set period
  456.     MOVE.W    n_dmabit(A6),D0
  457.     OR.W    D0,mt_DMACONtemp
  458.     BRA    mt_CheckMoreEfx
  459.  
  460. mt_SetDMA
  461.     MOVE.W    #300,D0
  462. mt_WaitDMA
  463.     DBRA    D0,mt_WaitDMA
  464.     MOVE.W    mt_DMACONtemp(PC),D0
  465.     OR.W    #$8000,D0
  466.     MOVE.W    D0,$DFF096
  467.     MOVE.W    #300,D0
  468. mt_WaitDMA2
  469.     DBRA    D0,mt_WaitDMA2
  470.  
  471.     LEA    $DFF000,A5
  472.     LEA    mt_chan4temp(PC),A6
  473.     MOVE.L    n_loopstart(A6),$D0(A5)
  474.     MOVE.W    n_replen(A6),$D4(A5)
  475.     LEA    mt_chan3temp(PC),A6
  476.     MOVE.L    n_loopstart(A6),$C0(A5)
  477.     MOVE.W    n_replen(A6),$C4(A5)
  478.     LEA    mt_chan2temp(PC),A6
  479.     MOVE.L    n_loopstart(A6),$B0(A5)
  480.     MOVE.W    n_replen(A6),$B4(A5)
  481.     LEA    mt_chan1temp(PC),A6
  482.     MOVE.L    n_loopstart(A6),$A0(A5)
  483.     MOVE.W    n_replen(A6),$A4(A5)
  484.  
  485. mt_dskip
  486.     ADD.W    #16,mt_PatternPos
  487.     MOVE.B    mt_PattDelTime,D0
  488.     BEQ.S    mt_dskc
  489.     MOVE.B    D0,mt_PattDelTime2
  490.     CLR.B    mt_PattDelTime
  491. mt_dskc    TST.B    mt_PattDelTime2
  492.     BEQ.S    mt_dska
  493.     SUBQ.B    #1,mt_PattDelTime2
  494.     BEQ.S    mt_dska
  495.     SUB.W    #16,mt_PatternPos
  496. mt_dska    TST.B    mt_PBreakFlag
  497.     BEQ.S    mt_nnpysk
  498.     SF    mt_PBreakFlag
  499.     MOVEQ    #0,D0
  500.     MOVE.B    mt_PBreakPos(PC),D0
  501.     CLR.B    mt_PBreakPos
  502.     LSL.W    #4,D0
  503.     MOVE.W    D0,mt_PatternPos
  504. mt_nnpysk
  505.     CMP.W    #1024,mt_PatternPos
  506.     BLO.S    mt_NoNewPosYet
  507. mt_NextPosition    
  508.     MOVEQ    #0,D0
  509.     MOVE.B    mt_PBreakPos(PC),D0
  510.     LSL.W    #4,D0
  511.     MOVE.W    D0,mt_PatternPos
  512.     CLR.B    mt_PBreakPos
  513.     CLR.B    mt_PosJumpFlag
  514.     ADDQ.B    #1,mt_SongPos
  515.     AND.B    #$7F,mt_SongPos
  516.     MOVE.B    mt_SongPos(PC),D1
  517.     MOVE.L    mt_SongDataPtr(PC),A0
  518.     CMP.B    950(A0),D1
  519.     BLO.S    mt_NoNewPosYet
  520.     CLR.B    mt_SongPos
  521. mt_NoNewPosYet    
  522.     TST.B    mt_PosJumpFlag
  523.     BNE.S    mt_NextPosition
  524. mt_exit    MOVEM.L    (SP)+,D0-D4/A0-A6
  525.     RTS
  526.  
  527. mt_CheckEfx
  528.     BSR    mt_UpdateFunk
  529.     MOVE.W    n_cmd(A6),D0
  530.     AND.W    #$0FFF,D0
  531.     BEQ.S    mt_PerNop
  532.     MOVE.B    n_cmd(A6),D0
  533.     AND.B    #$0F,D0
  534.     BEQ.S    mt_Arpeggio
  535.     CMP.B    #1,D0
  536.     BEQ    mt_PortaUp
  537.     CMP.B    #2,D0
  538.     BEQ    mt_PortaDown
  539.     CMP.B    #3,D0
  540.     BEQ    mt_TonePortamento
  541.     CMP.B    #4,D0
  542.     BEQ    mt_Vibrato
  543.     CMP.B    #5,D0
  544.     BEQ    mt_TonePlusVolSlide
  545.     CMP.B    #6,D0
  546.     BEQ    mt_VibratoPlusVolSlide
  547.     CMP.B    #$E,D0
  548.     BEQ    mt_E_Commands
  549. SetBack    MOVE.W    n_period(A6),6(A5)
  550.     CMP.B    #7,D0
  551.     BEQ    mt_Tremolo
  552.     CMP.B    #$A,D0
  553.     BEQ    mt_VolumeSlide
  554. mt_Return
  555.     RTS
  556.  
  557. mt_PerNop
  558.     MOVE.W    n_period(A6),6(A5)
  559.     RTS
  560.  
  561. mt_Arpeggio
  562.     MOVEQ    #0,D0
  563.     MOVE.B    mt_counter(PC),D0
  564.     DIVS    #3,D0
  565.     SWAP    D0
  566.     CMP.W    #0,D0
  567.     BEQ.S    mt_Arpeggio2
  568.     CMP.W    #2,D0
  569.     BEQ.S    mt_Arpeggio1
  570.     MOVEQ    #0,D0
  571.     MOVE.B    n_cmdlo(A6),D0
  572.     LSR.B    #4,D0
  573.     BRA.S    mt_Arpeggio3
  574.  
  575. mt_Arpeggio1
  576.     MOVEQ    #0,D0
  577.     MOVE.B    n_cmdlo(A6),D0
  578.     AND.B    #15,D0
  579.     BRA.S    mt_Arpeggio3
  580.  
  581. mt_Arpeggio2
  582.     MOVE.W    n_period(A6),D2
  583.     BRA.S    mt_Arpeggio4
  584.  
  585. mt_Arpeggio3
  586.     ASL.W    #1,D0
  587.     MOVEQ    #0,D1
  588.     MOVE.B    n_finetune(A6),D1
  589.     MULU    #36*2,D1
  590.     LEA    mt_PeriodTable(PC),A0
  591.     ADD.L    D1,A0
  592.     MOVEQ    #0,D1
  593.     MOVE.W    n_period(A6),D1
  594.     MOVEQ    #36,D3
  595. mt_arploop
  596.     MOVE.W    (A0,D0.W),D2
  597.     CMP.W    (A0),D1
  598.     BHS.S    mt_Arpeggio4
  599.     ADDQ.L    #2,A0
  600.     DBRA    D3,mt_arploop
  601.     RTS
  602.  
  603. mt_Arpeggio4
  604.     MOVE.W    D2,6(A5)
  605.     RTS
  606.  
  607. mt_FinePortaUp
  608.     TST.B    mt_counter
  609.     BNE.S    mt_Return
  610.     MOVE.B    #$0F,mt_LowMask
  611. mt_PortaUp
  612.     MOVEQ    #0,D0
  613.     MOVE.B    n_cmdlo(A6),D0
  614.     AND.B    mt_LowMask(PC),D0
  615.     MOVE.B    #$FF,mt_LowMask
  616.     SUB.W    D0,n_period(A6)
  617.     MOVE.W    n_period(A6),D0
  618.     AND.W    #$0FFF,D0
  619.     CMP.W    #113,D0
  620.     BPL.S    mt_PortaUskip
  621.     AND.W    #$F000,n_period(A6)
  622.     OR.W    #113,n_period(A6)
  623. mt_PortaUskip
  624.     MOVE.W    n_period(A6),D0
  625.     AND.W    #$0FFF,D0
  626.     MOVE.W    D0,6(A5)
  627.     RTS    
  628.  
  629. mt_FinePortaDown
  630.     TST.B    mt_counter
  631.     BNE    mt_Return
  632.     MOVE.B    #$0F,mt_LowMask
  633. mt_PortaDown
  634.     CLR.W    D0
  635.     MOVE.B    n_cmdlo(A6),D0
  636.     AND.B    mt_LowMask(PC),D0
  637.     MOVE.B    #$FF,mt_LowMask
  638.     ADD.W    D0,n_period(A6)
  639.     MOVE.W    n_period(A6),D0
  640.     AND.W    #$0FFF,D0
  641.     CMP.W    #856,D0
  642.     BMI.S    mt_PortaDskip
  643.     AND.W    #$F000,n_period(A6)
  644.     OR.W    #856,n_period(A6)
  645. mt_PortaDskip
  646.     MOVE.W    n_period(A6),D0
  647.     AND.W    #$0FFF,D0
  648.     MOVE.W    D0,6(A5)
  649.     RTS
  650.  
  651. mt_SetTonePorta
  652.     MOVE.L    A0,-(SP)
  653.     MOVE.W    (A6),D2
  654.     AND.W    #$0FFF,D2
  655.     MOVEQ    #0,D0
  656.     MOVE.B    n_finetune(A6),D0
  657.     MULU    #37*2,D0
  658.     LEA    mt_PeriodTable(PC),A0
  659.     ADD.L    D0,A0
  660.     MOVEQ    #0,D0
  661. mt_StpLoop
  662.     CMP.W    (A0,D0.W),D2
  663.     BHS.S    mt_StpFound
  664.     ADDQ.W    #2,D0
  665.     CMP.W    #37*2,D0
  666.     BLO.S    mt_StpLoop
  667.     MOVEQ    #35*2,D0
  668. mt_StpFound
  669.     MOVE.B    n_finetune(A6),D2
  670.     AND.B    #8,D2
  671.     BEQ.S    mt_StpGoss
  672.     TST.W    D0
  673.     BEQ.S    mt_StpGoss
  674.     SUBQ.W    #2,D0
  675. mt_StpGoss
  676.     MOVE.W    (A0,D0.W),D2
  677.     MOVE.L    (SP)+,A0
  678.     MOVE.W    D2,n_wantedperiod(A6)
  679.     MOVE.W    n_period(A6),D0
  680.     CLR.B    n_toneportdirec(A6)
  681.     CMP.W    D0,D2
  682.     BEQ.S    mt_ClearTonePorta
  683.     BGE    mt_Return
  684.     MOVE.B    #1,n_toneportdirec(A6)
  685.     RTS
  686.  
  687. mt_ClearTonePorta
  688.     CLR.W    n_wantedperiod(A6)
  689.     RTS
  690.  
  691. mt_TonePortamento
  692.     MOVE.B    n_cmdlo(A6),D0
  693.     BEQ.S    mt_TonePortNoChange
  694.     MOVE.B    D0,n_toneportspeed(A6)
  695.     CLR.B    n_cmdlo(A6)
  696. mt_TonePortNoChange
  697.     TST.W    n_wantedperiod(A6)
  698.     BEQ    mt_Return
  699.     MOVEQ    #0,D0
  700.     MOVE.B    n_toneportspeed(A6),D0
  701.     TST.B    n_toneportdirec(A6)
  702.     BNE.S    mt_TonePortaUp
  703. mt_TonePortaDown
  704.     ADD.W    D0,n_period(A6)
  705.     MOVE.W    n_wantedperiod(A6),D0
  706.     CMP.W    n_period(A6),D0
  707.     BGT.S    mt_TonePortaSetPer
  708.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  709.     CLR.W    n_wantedperiod(A6)
  710.     BRA.S    mt_TonePortaSetPer
  711.  
  712. mt_TonePortaUp
  713.     SUB.W    D0,n_period(A6)
  714.     MOVE.W    n_wantedperiod(A6),D0
  715.     CMP.W    n_period(A6),D0
  716.     BLT.S    mt_TonePortaSetPer
  717.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  718.     CLR.W    n_wantedperiod(A6)
  719.  
  720. mt_TonePortaSetPer
  721.     MOVE.W    n_period(A6),D2
  722.     MOVE.B    n_glissfunk(A6),D0
  723.     AND.B    #$0F,D0
  724.     BEQ.S    mt_GlissSkip
  725.     MOVEQ    #0,D0
  726.     MOVE.B    n_finetune(A6),D0
  727.     MULU    #36*2,D0
  728.     LEA    mt_PeriodTable(PC),A0
  729.     ADD.L    D0,A0
  730.     MOVEQ    #0,D0
  731. mt_GlissLoop
  732.     CMP.W    (A0,D0.W),D2
  733.     BHS.S    mt_GlissFound
  734.     ADDQ.W    #2,D0
  735.     CMP.W    #36*2,D0
  736.     BLO.S    mt_GlissLoop
  737.     MOVEQ    #35*2,D0
  738. mt_GlissFound
  739.     MOVE.W    (A0,D0.W),D2
  740. mt_GlissSkip
  741.     MOVE.W    D2,6(A5) ; Set period
  742.     RTS
  743.  
  744. mt_Vibrato
  745.     MOVE.B    n_cmdlo(A6),D0
  746.     BEQ.S    mt_Vibrato2
  747.     MOVE.B    n_vibratocmd(A6),D2
  748.     AND.B    #$0F,D0
  749.     BEQ.S    mt_vibskip
  750.     AND.B    #$F0,D2
  751.     OR.B    D0,D2
  752. mt_vibskip
  753.     MOVE.B    n_cmdlo(A6),D0
  754.     AND.B    #$F0,D0
  755.     BEQ.S    mt_vibskip2
  756.     AND.B    #$0F,D2
  757.     OR.B    D0,D2
  758. mt_vibskip2
  759.     MOVE.B    D2,n_vibratocmd(A6)
  760. mt_Vibrato2
  761.     MOVE.B    n_vibratopos(A6),D0
  762.     LEA    mt_VibratoTable(PC),A4
  763.     LSR.W    #2,D0
  764.     AND.W    #$001F,D0
  765.     MOVEQ    #0,D2
  766.     MOVE.B    n_wavecontrol(A6),D2
  767.     AND.B    #$03,D2
  768.     BEQ.S    mt_vib_sine
  769.     LSL.B    #3,D0
  770.     CMP.B    #1,D2
  771.     BEQ.S    mt_vib_rampdown
  772.     MOVE.B    #255,D2
  773.     BRA.S    mt_vib_set
  774. mt_vib_rampdown
  775.     TST.B    n_vibratopos(A6)
  776.     BPL.S    mt_vib_rampdown2
  777.     MOVE.B    #255,D2
  778.     SUB.B    D0,D2
  779.     BRA.S    mt_vib_set
  780. mt_vib_rampdown2
  781.     MOVE.B    D0,D2
  782.     BRA.S    mt_vib_set
  783. mt_vib_sine
  784.     MOVE.B    (A4,D0.W),D2
  785. mt_vib_set
  786.     MOVE.B    n_vibratocmd(A6),D0
  787.     AND.W    #15,D0
  788.     MULU    D0,D2
  789.     LSR.W    #7,D2
  790.     MOVE.W    n_period(A6),D0
  791.     TST.B    n_vibratopos(A6)
  792.     BMI.S    mt_VibratoNeg
  793.     ADD.W    D2,D0
  794.     BRA.S    mt_Vibrato3
  795. mt_VibratoNeg
  796.     SUB.W    D2,D0
  797. mt_Vibrato3
  798.     MOVE.W    D0,6(A5)
  799.     MOVE.B    n_vibratocmd(A6),D0
  800.     LSR.W    #2,D0
  801.     AND.W    #$003C,D0
  802.     ADD.B    D0,n_vibratopos(A6)
  803.     RTS
  804.  
  805. mt_TonePlusVolSlide
  806.     BSR    mt_TonePortNoChange
  807.     BRA    mt_VolumeSlide
  808.  
  809. mt_VibratoPlusVolSlide
  810.     BSR.S    mt_Vibrato2
  811.     BRA    mt_VolumeSlide
  812.  
  813. mt_Tremolo
  814.     MOVE.B    n_cmdlo(A6),D0
  815.     BEQ.S    mt_Tremolo2
  816.     MOVE.B    n_tremolocmd(A6),D2
  817.     AND.B    #$0F,D0
  818.     BEQ.S    mt_treskip
  819.     AND.B    #$F0,D2
  820.     OR.B    D0,D2
  821. mt_treskip
  822.     MOVE.B    n_cmdlo(A6),D0
  823.     AND.B    #$F0,D0
  824.     BEQ.S    mt_treskip2
  825.     AND.B    #$0F,D2
  826.     OR.B    D0,D2
  827. mt_treskip2
  828.     MOVE.B    D2,n_tremolocmd(A6)
  829. mt_Tremolo2
  830.     MOVE.B    n_tremolopos(A6),D0
  831.     LEA    mt_VibratoTable(PC),A4
  832.     LSR.W    #2,D0
  833.     AND.W    #$001F,D0
  834.     MOVEQ    #0,D2
  835.     MOVE.B    n_wavecontrol(A6),D2
  836.     LSR.B    #4,D2
  837.     AND.B    #$03,D2
  838.     BEQ.S    mt_tre_sine
  839.     LSL.B    #3,D0
  840.     CMP.B    #1,D2
  841.     BEQ.S    mt_tre_rampdown
  842.     MOVE.B    #255,D2
  843.     BRA.S    mt_tre_set
  844. mt_tre_rampdown
  845.     TST.B    n_vibratopos(A6)
  846.     BPL.S    mt_tre_rampdown2
  847.     MOVE.B    #255,D2
  848.     SUB.B    D0,D2
  849.     BRA.S    mt_tre_set
  850. mt_tre_rampdown2
  851.     MOVE.B    D0,D2
  852.     BRA.S    mt_tre_set
  853. mt_tre_sine
  854.     MOVE.B    (A4,D0.W),D2
  855. mt_tre_set
  856.     MOVE.B    n_tremolocmd(A6),D0
  857.     AND.W    #15,D0
  858.     MULU    D0,D2
  859.     LSR.W    #6,D2
  860.     MOVEQ    #0,D0
  861.     MOVE.B    n_volume(A6),D0
  862.     TST.B    n_tremolopos(A6)
  863.     BMI.S    mt_TremoloNeg
  864.     ADD.W    D2,D0
  865.     BRA.S    mt_Tremolo3
  866. mt_TremoloNeg
  867.     SUB.W    D2,D0
  868. mt_Tremolo3
  869.     BPL.S    mt_TremoloSkip
  870.     CLR.W    D0
  871. mt_TremoloSkip
  872.     CMP.W    #$40,D0
  873.     BLS.S    mt_TremoloOk
  874.     MOVE.W    #$40,D0
  875. mt_TremoloOk
  876.     MOVE.W    D0,8(A5)
  877.     MOVE.B    n_tremolocmd(A6),D0
  878.     LSR.W    #2,D0
  879.     AND.W    #$003C,D0
  880.     ADD.B    D0,n_tremolopos(A6)
  881.     RTS
  882.  
  883. mt_SampleOffset
  884.     MOVEQ    #0,D0
  885.     MOVE.B    n_cmdlo(A6),D0
  886.     BEQ.S    mt_sononew
  887.     MOVE.B    D0,n_sampleoffset(A6)
  888. mt_sononew
  889.     MOVE.B    n_sampleoffset(A6),D0
  890.     LSL.W    #7,D0
  891.     CMP.W    n_length(A6),D0
  892.     BGE.S    mt_sofskip
  893.     SUB.W    D0,n_length(A6)
  894.     LSL.W    #1,D0
  895.     ADD.L    D0,n_start(A6)
  896.     RTS
  897. mt_sofskip
  898.     MOVE.W    #$0001,n_length(A6)
  899.     RTS
  900.  
  901. mt_VolumeSlide
  902.     MOVEQ    #0,D0
  903.     MOVE.B    n_cmdlo(A6),D0
  904.     LSR.B    #4,D0
  905.     TST.B    D0
  906.     BEQ.S    mt_VolSlideDown
  907. mt_VolSlideUp
  908.     ADD.B    D0,n_volume(A6)
  909.     CMP.B    #$40,n_volume(A6)
  910.     BMI.S    mt_vsuskip
  911.     MOVE.B    #$40,n_volume(A6)
  912. mt_vsuskip
  913.     MOVE.B    n_volume(A6),D0
  914.     MOVE.W    D0,8(A5)
  915.     RTS
  916.  
  917. mt_VolSlideDown
  918.     MOVEQ    #0,D0
  919.     MOVE.B    n_cmdlo(A6),D0
  920.     AND.B    #$0F,D0
  921. mt_VolSlideDown2
  922.     SUB.B    D0,n_volume(A6)
  923.     BPL.S    mt_vsdskip
  924.     CLR.B    n_volume(A6)
  925. mt_vsdskip
  926.     MOVE.B    n_volume(A6),D0
  927.     MOVE.W    D0,8(A5)
  928.     RTS
  929.  
  930. mt_PositionJump
  931.     MOVE.B    n_cmdlo(A6),D0
  932.     SUBQ.B    #1,D0
  933.     MOVE.B    D0,mt_SongPos
  934. mt_pj2    CLR.B    mt_PBreakPos
  935.     ST     mt_PosJumpFlag
  936.     RTS
  937.  
  938. mt_VolumeChange
  939.     MOVEQ    #0,D0
  940.     MOVE.B    n_cmdlo(A6),D0
  941.     CMP.B    #$40,D0
  942.     BLS.S    mt_VolumeOk
  943.     MOVEQ    #$40,D0
  944. mt_VolumeOk
  945.     MOVE.B    D0,n_volume(A6)
  946.     MOVE.W    D0,8(A5)
  947.     RTS
  948.  
  949. mt_PatternBreak
  950.     MOVEQ    #0,D0
  951.     MOVE.B    n_cmdlo(A6),D0
  952.     MOVE.L    D0,D2
  953.     LSR.B    #4,D0
  954.     MULU    #10,D0
  955.     AND.B    #$0F,D2
  956.     ADD.B    D2,D0
  957.     CMP.B    #63,D0
  958.     BHI.S    mt_pj2
  959.     MOVE.B    D0,mt_PBreakPos
  960.     ST    mt_PosJumpFlag
  961.     RTS
  962.  
  963. mt_SetSpeed
  964.     MOVEQ    #0,D0
  965.     MOVE.B    3(A6),D0
  966.     BEQ    mt_end
  967.     CMP.B    #32,D0
  968.     BHS    SetTempo
  969.     CLR.B    mt_counter
  970.     MOVE.B    D0,mt_speed
  971.     RTS
  972.  
  973. mt_CheckMoreEfx
  974.     BSR    mt_UpdateFunk
  975.     MOVE.B    2(A6),D0
  976.     AND.B    #$0F,D0
  977.     CMP.B    #$9,D0
  978.     BEQ    mt_SampleOffset
  979.     CMP.B    #$B,D0
  980.     BEQ    mt_PositionJump
  981.     CMP.B    #$D,D0
  982.     BEQ.S    mt_PatternBreak
  983.     CMP.B    #$E,D0
  984.     BEQ.S    mt_E_Commands
  985.     CMP.B    #$F,D0
  986.     BEQ.S    mt_SetSpeed
  987.     CMP.B    #$C,D0
  988.     BEQ    mt_VolumeChange
  989.     BRA    mt_PerNop
  990.  
  991. mt_E_Commands
  992.     MOVE.B    n_cmdlo(A6),D0
  993.     AND.B    #$F0,D0
  994.     LSR.B    #4,D0
  995.     BEQ.S    mt_FilterOnOff
  996.     CMP.B    #1,D0
  997.     BEQ    mt_FinePortaUp
  998.     CMP.B    #2,D0
  999.     BEQ    mt_FinePortaDown
  1000.     CMP.B    #3,D0
  1001.     BEQ.S    mt_SetGlissControl
  1002.     CMP.B    #4,D0
  1003.     BEQ    mt_SetVibratoControl
  1004.     CMP.B    #5,D0
  1005.     BEQ    mt_SetFineTune
  1006.     CMP.B    #6,D0
  1007.     BEQ    mt_JumpLoop
  1008.     CMP.B    #7,D0
  1009.     BEQ    mt_SetTremoloControl
  1010.     CMP.B    #9,D0
  1011.     BEQ    mt_RetrigNote
  1012.     CMP.B    #$A,D0
  1013.     BEQ    mt_VolumeFineUp
  1014.     CMP.B    #$B,D0
  1015.     BEQ    mt_VolumeFineDown
  1016.     CMP.B    #$C,D0
  1017.     BEQ    mt_NoteCut
  1018.     CMP.B    #$D,D0
  1019.     BEQ    mt_NoteDelay
  1020.     CMP.B    #$E,D0
  1021.     BEQ    mt_PatternDelay
  1022.     CMP.B    #$F,D0
  1023.     BEQ    mt_FunkIt
  1024.     RTS
  1025.  
  1026. mt_FilterOnOff
  1027.     MOVE.B    n_cmdlo(A6),D0
  1028.     AND.B    #1,D0
  1029.     ASL.B    #1,D0
  1030.     AND.B    #$FD,$BFE001
  1031.     OR.B    D0,$BFE001
  1032.     RTS    
  1033.  
  1034. mt_SetGlissControl
  1035.     MOVE.B    n_cmdlo(A6),D0
  1036.     AND.B    #$0F,D0
  1037.     AND.B    #$F0,n_glissfunk(A6)
  1038.     OR.B    D0,n_glissfunk(A6)
  1039.     RTS
  1040.  
  1041. mt_SetVibratoControl
  1042.     MOVE.B    n_cmdlo(A6),D0
  1043.     AND.B    #$0F,D0
  1044.     AND.B    #$F0,n_wavecontrol(A6)
  1045.     OR.B    D0,n_wavecontrol(A6)
  1046.     RTS
  1047.  
  1048. mt_SetFineTune
  1049.     MOVE.B    n_cmdlo(A6),D0
  1050.     AND.B    #$0F,D0
  1051.     MOVE.B    D0,n_finetune(A6)
  1052.     RTS
  1053.  
  1054. mt_JumpLoop
  1055.     TST.B    mt_counter
  1056.     BNE    mt_Return
  1057.     MOVE.B    n_cmdlo(A6),D0
  1058.     AND.B    #$0F,D0
  1059.     BEQ.S    mt_SetLoop
  1060.     TST.B    n_loopcount(A6)
  1061.     BEQ.S    mt_jumpcnt
  1062.     SUBQ.B    #1,n_loopcount(A6)
  1063.     BEQ    mt_Return
  1064. mt_jmploop    MOVE.B    n_pattpos(A6),mt_PBreakPos
  1065.     ST    mt_PBreakFlag
  1066.     RTS
  1067.  
  1068. mt_jumpcnt
  1069.     MOVE.B    D0,n_loopcount(A6)
  1070.     BRA.S    mt_jmploop
  1071.  
  1072. mt_SetLoop
  1073.     MOVE.W    mt_PatternPos(PC),D0
  1074.     LSR.W    #4,D0
  1075.     MOVE.B    D0,n_pattpos(A6)
  1076.     RTS
  1077.  
  1078. mt_SetTremoloControl
  1079.     MOVE.B    n_cmdlo(A6),D0
  1080.     AND.B    #$0F,D0
  1081.     LSL.B    #4,D0
  1082.     AND.B    #$0F,n_wavecontrol(A6)
  1083.     OR.B    D0,n_wavecontrol(A6)
  1084.     RTS
  1085.  
  1086. mt_RetrigNote
  1087.     MOVE.L    D1,-(SP)
  1088.     MOVEQ    #0,D0
  1089.     MOVE.B    n_cmdlo(A6),D0
  1090.     AND.B    #$0F,D0
  1091.     BEQ.S    mt_rtnend
  1092.     MOVEQ    #0,D1
  1093.     MOVE.B    mt_counter(PC),D1
  1094.     BNE.S    mt_rtnskp
  1095.     MOVE.W    (A6),D1
  1096.     AND.W    #$0FFF,D1
  1097.     BNE.S    mt_rtnend
  1098.     MOVEQ    #0,D1
  1099.     MOVE.B    mt_counter(PC),D1
  1100. mt_rtnskp
  1101.     DIVU    D0,D1
  1102.     SWAP    D1
  1103.     TST.W    D1
  1104.     BNE.S    mt_rtnend
  1105. mt_DoRetrig
  1106.     MOVE.W    n_dmabit(A6),$DFF096    ; Channel DMA off
  1107.     MOVE.L    n_start(A6),(A5)    ; Set sampledata pointer
  1108.     MOVE.W    n_length(A6),4(A5)    ; Set length
  1109.     MOVE.W    #300,D0
  1110. mt_rtnloop1
  1111.     DBRA    D0,mt_rtnloop1
  1112.     MOVE.W    n_dmabit(A6),D0
  1113.     BSET    #15,D0
  1114.     MOVE.W    D0,$DFF096
  1115.     MOVE.W    #300,D0
  1116. mt_rtnloop2
  1117.     DBRA    D0,mt_rtnloop2
  1118.     MOVE.L    n_loopstart(A6),(A5)
  1119.     MOVE.L    n_replen(A6),4(A5)
  1120. mt_rtnend
  1121.     MOVE.L    (SP)+,D1
  1122.     RTS
  1123.  
  1124. mt_VolumeFineUp
  1125.     TST.B    mt_counter
  1126.     BNE    mt_Return
  1127.     MOVEQ    #0,D0
  1128.     MOVE.B    n_cmdlo(A6),D0
  1129.     AND.B    #$F,D0
  1130.     BRA    mt_VolSlideUp
  1131.  
  1132. mt_VolumeFineDown
  1133.     TST.B    mt_counter
  1134.     BNE    mt_Return
  1135.     MOVEQ    #0,D0
  1136.     MOVE.B    n_cmdlo(A6),D0
  1137.     AND.B    #$0F,D0
  1138.     BRA    mt_VolSlideDown2
  1139.  
  1140. mt_NoteCut
  1141.     MOVEQ    #0,D0
  1142.     MOVE.B    n_cmdlo(A6),D0
  1143.     AND.B    #$0F,D0
  1144.     CMP.B    mt_counter(PC),D0
  1145.     BNE    mt_Return
  1146.     CLR.B    n_volume(A6)
  1147.     MOVE.W    #0,8(A5)
  1148.     RTS
  1149.  
  1150. mt_NoteDelay
  1151.     MOVEQ    #0,D0
  1152.     MOVE.B    n_cmdlo(A6),D0
  1153.     AND.B    #$0F,D0
  1154.     CMP.B    mt_Counter,D0
  1155.     BNE    mt_Return
  1156.     MOVE.W    (A6),D0
  1157.     BEQ    mt_Return
  1158.     MOVE.L    D1,-(SP)
  1159.     BRA    mt_DoRetrig
  1160.  
  1161. mt_PatternDelay
  1162.     TST.B    mt_counter
  1163.     BNE    mt_Return
  1164.     MOVEQ    #0,D0
  1165.     MOVE.B    n_cmdlo(A6),D0
  1166.     AND.B    #$0F,D0
  1167.     TST.B    mt_PattDelTime2
  1168.     BNE    mt_Return
  1169.     ADDQ.B    #1,D0
  1170.     MOVE.B    D0,mt_PattDelTime
  1171.     RTS
  1172.  
  1173. mt_FunkIt
  1174.     TST.B    mt_counter
  1175.     BNE    mt_Return
  1176.     MOVE.B    n_cmdlo(A6),D0
  1177.     AND.B    #$0F,D0
  1178.     LSL.B    #4,D0
  1179.     AND.B    #$0F,n_glissfunk(A6)
  1180.     OR.B    D0,n_glissfunk(A6)
  1181.     TST.B    D0
  1182.     BEQ    mt_Return
  1183. mt_UpdateFunk
  1184.     MOVEM.L    A0/D1,-(SP)
  1185.     MOVEQ    #0,D0
  1186.     MOVE.B    n_glissfunk(A6),D0
  1187.     LSR.B    #4,D0
  1188.     BEQ.S    mt_funkend
  1189.     LEA    mt_FunkTable(PC),A0
  1190.     MOVE.B    (A0,D0.W),D0
  1191.     ADD.B    D0,n_funkoffset(A6)
  1192.     BTST    #7,n_funkoffset(A6)
  1193.     BEQ.S    mt_funkend
  1194.     CLR.B    n_funkoffset(A6)
  1195.  
  1196.     MOVE.L    n_loopstart(A6),D0
  1197.     MOVEQ    #0,D1
  1198.     MOVE.W    n_replen(A6),D1
  1199.     ADD.L    D1,D0
  1200.     ADD.L    D1,D0
  1201.     MOVE.L    n_wavestart(A6),A0
  1202.     ADDQ.L    #1,A0
  1203.     CMP.L    D0,A0
  1204.     BLO.S    mt_funkok
  1205.     MOVE.L    n_loopstart(A6),A0
  1206. mt_funkok
  1207.     MOVE.L    A0,n_wavestart(A6)
  1208.     MOVEQ    #-1,D0
  1209.     SUB.B    (A0),D0
  1210.     MOVE.B    D0,(A0)
  1211. mt_funkend
  1212.     MOVEM.L    (SP)+,A0/D1
  1213.     RTS
  1214.  
  1215.  
  1216. mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1217.  
  1218. mt_VibratoTable    
  1219.     dc.b   0, 24, 49, 74, 97,120,141,161
  1220.     dc.b 180,197,212,224,235,244,250,253
  1221.     dc.b 255,253,250,244,235,224,212,197
  1222.     dc.b 180,161,141,120, 97, 74, 49, 24
  1223.  
  1224. mt_PeriodTable
  1225. ; Tuning 0, Normal
  1226.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1227.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1228.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1229. ; Tuning 1
  1230.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1231.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1232.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1233. ; Tuning 2
  1234.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1235.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1236.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1237. ; Tuning 3
  1238.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1239.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1240.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1241. ; Tuning 4
  1242.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1243.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1244.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1245. ; Tuning 5
  1246.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1247.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1248.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1249. ; Tuning 6
  1250.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1251.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1252.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1253. ; Tuning 7
  1254.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1255.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1256.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1257. ; Tuning -8
  1258.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1259.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1260.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1261. ; Tuning -7
  1262.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1263.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1264.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1265. ; Tuning -6
  1266.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1267.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1268.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1269. ; Tuning -5
  1270.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1271.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1272.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1273. ; Tuning -4
  1274.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1275.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1276.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1277. ; Tuning -3
  1278.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1279.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1280.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1281. ; Tuning -2
  1282.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1283.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1284.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1285. ; Tuning -1
  1286.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1287.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1288.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1289.  
  1290. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,  0,0,0,0
  1291. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,  0,0,0,0
  1292. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,  0,0,0,0
  1293. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,  0,0,0,0
  1294.  
  1295. mt_SampleStarts    dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1296.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1297.  
  1298. mt_SongDataPtr    dc.l 0
  1299. mt_speed    dc.b 6
  1300. mt_counter    dc.b 0
  1301. mt_SongPos    dc.b 0
  1302. mt_PBreakPos    dc.b 0
  1303. mt_PosJumpFlag    dc.b 0
  1304. mt_PBreakFlag    dc.b 0
  1305. mt_LowMask    dc.b 0
  1306. mt_PattDelTime    dc.b 0
  1307. mt_PattDelTime2    dc.b 0
  1308. mt_Enable    dc.b 0
  1309. mt_PatternPos    dc.w 0
  1310. mt_DMACONtemp    dc.w 0
  1311.  
  1312. ;/* End of File */
  1313.  
  1314.     section    ddp,data_c
  1315.  
  1316. mt_data:    incbin    "dh1:techno/mod.2"
  1317.  
  1318.